“Controlar la complejidad es la esencia de la programación” (Brian Kernigan)
“Solo podemos entender algo si podemos programarlo” (Gregory Chaitin)
El concepto de agente
Un agente es una entidad computacional que reside en un entorno dinámico que tiene la capacidad de percibir y actuar autónomamente sobre dicho entorno. De esta manera, es capaz de cumplir un conjunto de objetivos o llevar a cabo ciertas tareas para las cuales fue diseñado.
Este paradigma de ingeniería de software ha surgido con gran fuerza en los últimos años, pues es especialmente adecuado para la resolución de problemas complejos, principalmente del campo de la inteligencia artificial. Además constituye una forma muy adecuada para la creación de modelos del mundo real.
La descomposición de un problema en agentes representa la forma más radical de aplicación de la filosofía “divide y vencerás”, en donde cada agente se ocupa de una parte del problema y en donde todos los agentes colaboran y coordinan sus actividades para la consecución de un objetivo final.
Tipos de agentes
Existen muchas clases de agentes. Algunos ejemplos son:
De búsqueda.
De transacción.
De ayuda o asistencia.
De filtrado de información.
De monitorización.
De presentación.
De seguridad (restrictivos, vigilantes, etc.).
De interfaz (para interactuar con el usuario).
Servidores (ofrecen sus servicios a otros agentes).
Clientes (usan la información y servicios de los agentes servidores).
Intermediarios: Por ejemplo los que actúan entre agentes clientes y servidores, como los agentes tipo broker (que ofrecen transacciones completas) y los agentes directorio (que ofrecen un directorio de los servicios ofrecidos por otros agentes).
Características de los agentes
Un agente es una entidad computacional que tiene las características identificativas siguientes:
Autonomía.
Un agente actúa por sí mismo, sin intervención externa (humana o de otros agentes), a la vez que posee control sobre su estado interno y sus acciones.
Sociabilidad.
Es la capacidad de interaccionar con otros agentes (incluso humanos) y con el entorno del sistema. La máxima sociabilidad se produce cuando los agentes colaboran para la consecución de un objetivo común.
Reactividad.
Los agentes “perciben” o son sensibles al entorno en el que están inmersos y reaccionan a los cambios que tienen lugar en él, realizando acciones y/o modificando su estado interno.
Conocimiento.
Un agente, en todo momento, tiene conocimiento de su estado interno y de su entorno. Partiendo de ese conocimiento es capaz de aproximarse a sus objetivos de forma autónoma.
Inteligencia.
Un agente se comporta de acuerdo a una lógica interna, que se pone en acción según la situación del entorno o de su estado interno.
Iniciativa (proactividad).
Un agente tiene iniciativa para actuar con el fin de lograr sus objetivos. En cada momento (en función de su sensibilidad al entorno) decide si debe o no actuar y si debe o no modificar su estado interno. Este proceso interno se denomina “deliberación”.
Otras características adicionales que pueden poser los agentes son:
Adaptabilidad.
Es la capacidad de cambiar su comportamiento en función de sus experiencias (aprendizaje). El comportamiento podría ser abierto, es decir, no predecible.
Movilidad.
Un agente móvil es el que se puede mover físicamente por los nodos de una red o trasladarse (o actuar) en otros entornos. Su finalidad sería compartir mejor los recursos, distribuir la carga de procesos, etc.
Desarrollo tradicional con agentes
Históricamente, la programación orientada a agentes se ha soportado por la integración de dos paradigmas: el paradigma de la orientación a objetos y el paradigma lógico. Un agente se construía como un objeto y su comportamiento se implementaba mediante claúsulas lógicas. Un ejemplo de este tipo de enfoque es JavaLog, un lenguaje mezcla de Java (programación orientada a objetos) y Prolog (programación lógica), en la que un agente es un objeto Java que hace referencia a un módulo lógico (que contiene las claúsulas lógicas).
Aunque actualmente hay muchas aplicaciones implementadas con la tecnología de agentes, el tema no ha alcanzado todavía madurez y popularidad suficientes, debido principalmente a:
La gran aceptación y difusión alcanzada con la tecnología de objetos.
La variedad de metodologías existentes.
La dificultad de análisis y diseño. Estas tareas son complejas, pues requieren la definición de una ontología específica del sistema, de las tareas de los agentes, la interrelación entre agentes y los métodos de cooperación (delegación, negociación, etc.).
La dificultad de utilización, al tener que acudir a lenguajes, herramientas o plataformas especializadas. Y además que normalmente no se adaptan totalmente a las necesidades de cada problema.
Un ejemplo de herramienta de desarrollo es Agent Buildar Pro (de Reticular Systems), que genera agentes Java.
Plataformas de desarrollo conocidas son JADE (Java Agent Development) e IMPACT (Interactive Maryland Platform for Agents Collaborating Together).
Agentes vs. Objetos
Existe una cierta analogía entre el paradigma objetual y el de agentes:
Los agentes se pueden considerar objetos activos autónomos.
Ambos implementan abstracciones, aunque el nivel de abstracción en el caso de los agentes es mayor que en el de los objetos.
Una diferencia importante es que las metodologías de orientación a objetos no se pueden emplear directamente en la orientación a agentes.
Agentes vs. Procesos
Los agentes recuerdan a los procesos de un sistema multiproceso (por ejemplo, un sistema operativo). Pero la diferencia estriba en que un agente tiene autonomía, “sabe” cuando tiene que actuar, mientras que un proceso debe ser invocado explícitamente para que actúe.
Los agentes normalmente actúan de forma concurrente. En el tema del acceso a recursos compartidos, por parte de diferentes agentes, se plantean los mismos problemas que en la programación concurrente.
Agentes inteligentes
El término “agente inteligente” se comenzó a usar en los años 1980´s en el subdominio de la inteligencia artificial llamado “inteligencia artificial distribuida” (IAD). Su concepto era el de un objeto con inteligencia incorporada o autocontenida. En IAD los agentes inteligentes tienen un comportamiento colectivo y cooperativo.
Los agentes y la interoperabilidad del software
La tecnología de agentes se ha propuesto como un sistema para lograr la interoperabilidad del software, mediante una ontología común:
Los agentes encapsulan los programas en un lenguaje de representación del conocimiento llamado KIF (Knowledge Interchange Format).
La comunicación entre agentes se realiza mediante un lenguaje llamado KQML (Knowledge Query and Manipulation Language).
Sistema multi-agente
Consta de los siguientes elementos:
Un conjunto de agentes, que representan las entidades perceptivas y activas del sistema.
Un entorno en el que “viven” los agentes (las entidades activas) y en el que residen también los objetos (las entidades pasivas) manejadas por los agentes.
Un conjunto de relaciones de comunicación entre los agentes.
Un sistema multi-agente puede contener agentes cooperativos y no cooperativos.
Un agente no cooperativo es un agente que actúa independientemente de los otros agentes y que realiza una determinada tarea predeterminada.
Un agente cooperativo es el que colabora con otros agentes. Los agentes cooperativos pueden forman grupos. Cada grupo se puede considerar como un agente cooperativo de nivel superior, cuyos componentes son subagentes. Un sistema con agentes cooperativos permite abordar y resolver problemas que están más allá de las capacidades de los agentes individuales.
En ambos casos, cada agente (sea cooperativo o no) siempre contribuye al funcionamiento global del sistema.
Desarrollo de Agentes con MENTAL
MENTAL es un lenguaje de supremo nivel de abstracción, de paradigma universal, que posibilita la programación orientada a agentes sin ningún recurso adicional. No se necesita, en absoluto, ningún lenguaje específico que contemple los sistemas de agentes ni ningún sistema de representación del conocimiento. Con MENTAL todo es más sencillo.
Aspectos a destacar en el desarrollo con agentes con MENTAL son los siguientes:
Definición.
Un agente se define mediante una o varias expresiones genéricas condicionales, como en la programación orientada a eventos. Estas expresiones rigen su comportamiento o lógica. Se activan cuando cambia la parte del entorno a la que es sensible el agente, o bien su estado interno. La parte relativa a la “acción” asociada al evento se implementa mediante otras expresiones activas (procedimientos funciones, reglas, etc.), que son de tipo secundario o subordinado.
Una vez más, las expresiones genéricas constituyen el elemento integrador de los paradigmas de programación.
Comunicación entre agentes.
No se necesita ningún lenguaje de comunicación directa entre agentes. La comunicación se puede realizar de manera indirecta a través del espacio abstracto. Este método es más sencillo y flexible, y tiene la ventaja adicional de que de que un agente se puede comunicar con varios a la vez, pues los agentes son sensibles al espacio abstracto.
Integración de paradigmas.
Como MENTAL es un lenguaje universal, permite integrar la programación orientada a agentes con otros paradigmas. De hecho, se diluye la frontera entre los diferentes paradigmas: todos los paradigmas son manifestaciones de las mismas primitivas semánticas.
Interoperabilidad del software.
La interoperabilidad del software no debe basarse en un paradigma particular como es la programación orientada a agentes. Debe basarse en algo más profundo y general. Se logra fácilmente mediante la ontología universal de las primitivas de MENTAL.
MENTAL también permite el desarrollo de recursos de alto nivel como:
Agentes virtuales (agentes construidos a partir de componentes de otros agentes).
Agentes genéricos parametrizados, a partir de los cuales se pueden crear agentes específicos.
Agentes jerarquizados (agentes que pueden activar o desactivar otros agentes).
Agentes dinámicos (agentes que cambian su comportamiento).
Agentes generadores de otros agentes (meta-agentes).
Agentes inteligentes, para la inteligencia artificial.
Etc.
Adenda
FIPA (Foundation for Intelligent Physical Agents)
Es la organización que define los estándares en ingeniería de software orientada a agentes: las ontologías (es decir, los conceptos y sus relaciones), los protocolos de interacción entre agentes, etc. Su dirección Web es: http://www.fipa.org
Bibliografía
Ferber, Jacques. Multi-Agent Systems. An introduction to Distributed Artificial Intelligence. Addison-Wesley, 1999.
Huntbach, Matthew M; Ringwood, Graem A. Agent-Oriented Programming: from Prolog to Guarded Definite Clauses. Springer, 1999.
Lesnick, Leslie L.; Moore, Ralph E. Creación de Agentes Inteligentes en Internet. Anaya Multimedia, 1997.
Nilsson, Nils J. Inteligencia Artificial. Una nueva síntesis. McGraw Hill/Interamericana de España, 2004.
Weiss, G. Multiagent Systems. A modern approach to distributed artificial intelligence. The MIT Press, 1999.
Wooldridge, M; Jenings, N.; Kinny, D. The Gaia Methodology for Agent-Oriented Analysis and Design. International Journal of Autonomous Agents and Multi-Agent Systems, 2000.